﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;
using NGI_Enumerador;
using NGI_Entidades;
using NGI_Logica;
using NGI_Auxiliares;
using NGI_Mensaje;

namespace NGI_Sistema.Forms
{
    public partial class ABMProveedores : Form
    {

        #region Propiedades
        private Proveedor _proveedorSeleccionado;

        private ResultadosOperaciones _resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
        private CartelResultadoOperacion car;
        private TiposOperaciones _operacion = TiposOperaciones.Alta;
        private ArrayList _validaciones = new ArrayList();

        public delegate void functioncall(Int32 Id);
        private event functioncall seleccionFunctionPointer;
        private event functioncall eliminacionFunctionPointer;

        private GrillaBusquedaEliminacion gre = new GrillaBusquedaEliminacion(TiposDatos.Proveedor, 337);
        #endregion Propiedades

        
        #region Constructores
        public ABMProveedores()
        {
            InitializeComponent();
        }
        
        public ABMProveedores(Int32 Id)
        {
            InitializeComponent();
            this.EntidadSeleccionada(Id);
            this.gre.SeleccionarItem(Id);
        }
        #endregion Constructores


        #region Receptor de grilla de búsqueda
        private void EliminarEntidad(Int32 Id)
        {
            try
            {
                this._operacion = TiposOperaciones.Baja;

                Proveedor unProveedor = Proveedor.SinDatos(Id);
                Proveedores.EliminarTelefonos(unProveedor);
                Proveedores.Eliminar(unProveedor.ID);

                ArrayList ListadoProveedores = Proveedores.CargarTodos(true);
                gre.CargarDatos(ListadoProveedores);
                this.pnlPersonalizado.Controls.Add(gre);
                this._resultadoUltimaOperacion = ResultadosOperaciones.Exitoso;
                this.LimpiarInputs();
                this.CartelesNegros();
            }
            catch (Exception Ex)
            {
                this._resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
            }
            this.car.ElResultadoFue(this._resultadoUltimaOperacion);
            this.lblOperacion.Text = "Creando proveedor.";
        }

        private void EntidadSeleccionada(Int32 Id)
        {
            this._operacion = TiposOperaciones.Modificacion;
            this._proveedorSeleccionado = Proveedores.TraerDatosDe(Id);
            this.LlenarCampos();
            this.CartelesNegros();

            this.lblOperacion.Text = "Modificando proveedor: " + this._proveedorSeleccionado.RazonSocial;
            
        }
        #endregion Receptor de grilla de búsqueda


        #region Funciones Privadas
        private void LlenarCampos()
        {
            this.txtId.Text = this._proveedorSeleccionado.ID.ToString();
            this.txtRazonSocial.Text = this._proveedorSeleccionado.RazonSocial.ToString();
            this.txtEmail.Text = this._proveedorSeleccionado.Email.ToString();
            this.txtDireccion.Text = this._proveedorSeleccionado.Direccion.ToString();
            this.txtCUIT.Text = this._proveedorSeleccionado.CUIT.ToString();
            this.txtContacto.Text = this._proveedorSeleccionado.Contacto.ToString();
            this.txtCodigoPostal.Text = this._proveedorSeleccionado.CodigoPostal.ToString();
            this.txtCiudad.Text = this._proveedorSeleccionado.Ciudad.ToString();
            this.txtSaldoTotal.Text = this._proveedorSeleccionado.SaldoTotal.ToString();
            this.txtISIB.Text = this._proveedorSeleccionado.ISIB.ToString();
            this.txtIngresosBrutos.Text = this._proveedorSeleccionado.IngresosBrutos;
            this.txtLocalidad.Text = this._proveedorSeleccionado.Localidad;
           
            this.txtSaldoTotal.ForeColor = this._proveedorSeleccionado.SaldoTotal < 0 ? Color.Red : Color.Black;
           
            this.cmbCategoriaIVA.SelectedValue = this._proveedorSeleccionado.CategoriaIVA.ID;
            this.cmbProvincia.SelectedValue = this._proveedorSeleccionado.Provincia.ID;

            this.chkActivo.Checked = this._proveedorSeleccionado.Activo;

            this.dgvTelefonos.Rows.Clear();

            if (this._proveedorSeleccionado.Telefonos != null && this._proveedorSeleccionado.Telefonos.Length > 0)
            {
                foreach (Telefono Tel in this._proveedorSeleccionado.Telefonos)
                {
                    this.dgvTelefonos.Rows.Add(TipoTelefono.DameIndiceDe(Tel.Tipo), Tel.Numero.ToString(), Tel.Activo ? CheckState.Checked : CheckState.Unchecked);
                }
            }

            this.picCUITValido.Image = new Bitmap(ConfigurationManager.AppSettings["DirectorioRuta"].ToString() + ConfigurationManager.AppSettings["DirectorioRecursos"].ToString() + ConfigurationManager.AppSettings["DirectorioImagenes"].ToString() + ConfigurationManager.AppSettings["DirectorioSistema"].ToString() + ((new CUIT(this.txtCUIT.Text)).EsValido ? CUIT.NombreImagenExitoso : CUIT.NombreImagenNoExitoso), true);
        }

        private void AgregarValidaciones()
        {
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtRazonSocial, this.lblRazonSocial, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtDireccion, this.lblDireccion, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtEmail, this.lblEmail, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtCUIT, this.lblCUIT, TiposValidaciones.Requerido));
        }

        private void CartelesNegros()
        {
            this.lblCategoriaIVA.ForeColor = Color.Black;
            this.lblCiudad.ForeColor = Color.Black;
            this.lblCodigoPostal.ForeColor = Color.Black;
            this.lblContacto.ForeColor = Color.Black;
            this.lblDireccion.ForeColor = Color.Black;
            this.lblEmail.ForeColor = Color.Black;
            this.lblId.ForeColor = Color.Black;
            this.lblRazonSocial.ForeColor = Color.Black;
            this.lblSaldoTotal.ForeColor = Color.Black;
            this.lblISIB.ForeColor = Color.Black;
            this.lblIngresosBrutos.ForeColor = Color.Black;
        }

        private void CargarCategoriasIVA()
        {
            ArrayList ListadoCategoriasIVA = CategoriasIVA.CargarActivos();
            FuncionesFormulario.CargarCombo(this.cmbCategoriaIVA, ListadoCategoriasIVA, "Nombre", "ID");
            this.cmbCategoriaIVA.SelectedIndex = 1;
        }

        private void CargarProvincias()
        {
            ArrayList ListadoProvincias = Provincias.CargarActivos();
            FuncionesFormulario.CargarCombo(this.cmbProvincia, ListadoProvincias, "Nombre", "ID");
            this.cmbProvincia.SelectedIndex = 3;
        }

        private void CargarTiposTelefonos()
        {
            FuncionesFormulario.CargarCombo(this.colTipo, Telefonos.CargarActivos(), "Nombre", "ID");
        }

        private void CrearCartelDeResultados()
        {
            this.car = new CartelResultadoOperacion(pnlCartelResultadoOperacion.Height, pnlCartelResultadoOperacion.Width, (this.pnlCartelResultadoOperacion.Location.Y - pnlCartelResultadoOperacion.Height));
            pnlCartelResultadoOperacion.Controls.Add(car);
        }

        private void LimpiarInputs()
        {
            this.txtContacto.Text = "";
            this.txtDireccion.Text = "";
            this.txtEmail.Text = "";
            this.txtId.Text = "";
            this.txtCodigoPostal.Text = "";
            this.txtRazonSocial.Text = "";
            this.txtSaldoTotal.Text = "";
            this.txtCUIT.Text = "";
            this.txtCiudad.Text = "";
            this.txtISIB.Text = "";
            this.txtIngresosBrutos.Text = "";
            this.txtLocalidad.Text = "";
            this.cmbCategoriaIVA.SelectedIndex = 2;
            this.cmbProvincia.SelectedIndex = 3;
            this.dgvTelefonos.Rows.Clear();
            this._proveedorSeleccionado = null;
            this.lblOperacion.Text = "Creando proveedor.";
        }

        private Telefono[] GenerarListadoTelefonos()
        {

            Telefono[] Telefonos = new Telefono[this.dgvTelefonos.Rows.Count - 1];

            Int32 a = 0;
            foreach (DataGridViewRow row in this.dgvTelefonos.Rows)
            {
                if (Convert.ToInt32(row.Cells[0].Value) > 0 && row.Cells[1].Value.ToString() != "")
                {
                    Telefonos[a] = Telefono.Nuevo(this.TipoTelefonoPorIndice(Convert.ToInt32(row.Cells[0].Value)), row.Cells[1].Value.ToString(), Convert.ToBoolean(row.Cells[2].Value));
                    a++;
                }
            }

            return Telefonos;
        }

        private TiposTelefonos TipoTelefonoPorIndice(Int32 Indice)
        {
            switch (Indice)
            {
                case 1:
                    return TiposTelefonos.Fijo;
                case 2:
                    return TiposTelefonos.Celular;
                case 3:
                    return TiposTelefonos.Fax;
                default:
                    return TiposTelefonos.Fijo;
            }
        }

        private Boolean CamposValidos()
        {
            Boolean CamposValidos = FuncionesFormulario.TodosLosCamposValidos(this._validaciones);
            return (new CUIT(this.txtCUIT.Text)).EsValido && CamposValidos;
        }
        #endregion Funciones Privadas


        #region Eventos
        private void ABMProveedores_Load(object sender, EventArgs e)
        {
            this.CrearCartelDeResultados();
            
            seleccionFunctionPointer += new functioncall(EntidadSeleccionada);
            eliminacionFunctionPointer += new functioncall(EliminarEntidad);
            gre.seleccionFunctionPointer = seleccionFunctionPointer;
            gre.eliminacionFunctionPointer = eliminacionFunctionPointer;

            if (this._proveedorSeleccionado == null)
                this.lblOperacion.Text = "Creando proveedor.";

            this.AgregarValidaciones();
            this.CargarCategoriasIVA();
            this.CargarTiposTelefonos();
            this.CargarProvincias();

            ArrayList ListadoProveedores = Proveedores.CargarTodos(true);
            gre.CargarDatos(ListadoProveedores);
            this.pnlPersonalizado.Controls.Add(gre);
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            this.CartelesNegros();

            if (this.CamposValidos())
            {

                Proveedor unProveedor = new Proveedor();
                Boolean CheckboxState = this.chkActivo.CheckState == CheckState.Checked ? true : false;
                Telefono[] ListadoTelefonos = this.GenerarListadoTelefonos();
                Provincia unaProvincia = Provincia.DatosMinimos(Convert.ToInt32(this.cmbProvincia.SelectedValue));

                try
                {
                    switch (this._operacion)
                    {
                        case TiposOperaciones.Alta:
                            unProveedor = Proveedor.Nuevo(this.txtCUIT.Text, this.txtRazonSocial.Text, this.txtEmail.Text, this.txtDireccion.Text, this.txtCodigoPostal.Text, this.txtCiudad.Text, this.txtLocalidad.Text, unaProvincia, this.txtContacto.Text, this.txtIngresosBrutos.Text, Convert.ToInt32(!String.IsNullOrEmpty(this.txtISIB.Text) ? this.txtISIB.Text : "0"), 0 , CategoriaIVA.DatosMinimos(Convert.ToInt32(this.cmbCategoriaIVA.SelectedValue)), ListadoTelefonos, CheckboxState);
                            Proveedores.Crear(unProveedor, Program.SesionActiva.UsuarioLogueado.ID);
                            break;
                        case TiposOperaciones.Modificacion:
                            unProveedor = Proveedor.Existente(Convert.ToInt32(this.txtId.Text), this.txtCUIT.Text, this.txtRazonSocial.Text, this.txtEmail.Text, this.txtDireccion.Text, this.txtCodigoPostal.Text, this.txtCiudad.Text, this.txtLocalidad.Text, unaProvincia, this.txtContacto.Text, this.txtIngresosBrutos.Text, Convert.ToInt32(this.txtISIB.Text), 0, CategoriaIVA.DatosMinimos(Convert.ToInt32(this.cmbCategoriaIVA.SelectedValue)), ListadoTelefonos, CheckboxState);
                            Proveedores.Modificar(unProveedor, Program.SesionActiva.UsuarioLogueado.ID);
                            break;
                    }

                    Proveedores.EliminarTelefonos(unProveedor);
                    Proveedores.InsertarTelefonos(unProveedor, Program.SesionActiva.UsuarioLogueado.ID);

                    this._resultadoUltimaOperacion = ResultadosOperaciones.Exitoso;
                    ArrayList ListadoProveedores = Proveedores.CargarTodos(true);
                    this.gre.CargarDatos(ListadoProveedores);

                    this.LimpiarInputs();
                    this.gre.DeseleccionarOpcion();
                }
                catch (Exception Ex)
                {
                    this._resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
                }

                this.gre.DeseleccionarOpcion();
            }
            else
            {
                this._resultadoUltimaOperacion = ResultadosOperaciones.CamposMinimosNoCompletados;
            }
            this.car.ElResultadoFue(this._resultadoUltimaOperacion);
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            this.lblOperacion.Text = "Creando proveedor.";
            this._operacion = TiposOperaciones.Alta;
            this.LimpiarInputs();
            this.CartelesNegros();
            this.gre.DeseleccionarOpcion();

            this.picCUITValido.Image = new Bitmap(ConfigurationManager.AppSettings["DirectorioRuta"].ToString() + ConfigurationManager.AppSettings["DirectorioRecursos"].ToString() + ConfigurationManager.AppSettings["DirectorioImagenes"].ToString() + ConfigurationManager.AppSettings["DirectorioSistema"].ToString() + ((new CUIT(this.txtCUIT.Text)).EsValido ? CUIT.NombreImagenExitoso : CUIT.NombreImagenNoExitoso), true);
        }

        private void txtCUIT_TextChanged(object sender, EventArgs e)
        {
            if (this.txtCUIT.Text.Length == 2 || this.txtCUIT.Text.Length == 11)
            {
                this.txtCUIT.Text += "-";
            }

            this.txtCUIT.Select(this.txtCUIT.Text.Length, 0);

            this.picCUITValido.Image = new Bitmap(ConfigurationManager.AppSettings["DirectorioRuta"].ToString() + ConfigurationManager.AppSettings["DirectorioRecursos"].ToString() + ConfigurationManager.AppSettings["DirectorioImagenes"].ToString() + ConfigurationManager.AppSettings["DirectorioSistema"].ToString() + ((new CUIT(this.txtCUIT.Text)).EsValido ? CUIT.NombreImagenExitoso : CUIT.NombreImagenNoExitoso), true);
        }

        private void txtCUIT_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = Funciones.EsNumeroOBackSpace(e.KeyChar);
        }

        private void txtISIB_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = Funciones.EsNumero(e.KeyChar);
        }
        #endregion Eventos
    }
}
